package models

import (
	"reflect"

	"github.com/beego/beego/v2/client/orm"
)

// GetById 根据ID获取记录
func GetById[T any](id int64) (*T, error) {
	var model T
	o := orm.NewOrm()

	// 创建一个临时变量来存储查询结果
	// 这样避免了双重指针的问题
	err := o.QueryTable(new(T)).Filter("id", id).Filter("is_deleted", 0).One(&model)

	return &model, err
}

// GetList 获取记录列表
func GetList[T any](page, pageSize int, filters map[string]interface{}) ([]T, int64, error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(T))

	// 排除已删除的记录
	qs = qs.Filter("is_deleted", 0)

	// 应用其他过滤条件
	for key, value := range filters {
		qs = qs.Filter(key, value)
	}

	// 获取总数
	total, _ := qs.Count()

	// 分页查询
	var models []T
	_, err := qs.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&models)

	return models, total, err
}

// Create 创建记录
func Create[T any](model *T) (int64, error) {
	o := orm.NewOrm()
	id, err := o.Insert(model)
	return id, err
}

// Update 更新记录
func Update[T any](model *T, fields ...string) error {
	o := orm.NewOrm()
	_, err := o.Update(model, fields...)
	return err
}

// Delete 删除记录（软删除）
func Delete[T any](id int64) error {
	o := orm.NewOrm()
	var model T
	// 查询记录
	err := o.QueryTable(new(T)).Filter("id", id).One(&model)
	if err != nil {
		return err
	}
	// 使用反射设置IsDeleted字段
	reflect.ValueOf(&model).Elem().FieldByName("IsDeleted").SetInt(1)
	_, err = o.Update(&model, "is_deleted", "updated_at")
	return err
}

// Count 获取记录总数
func Count[T any](filters map[string]interface{}) (int64, error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(T))

	// 应用过滤条件
	for key, value := range filters {
		if value != nil {
			qs = qs.Filter(key, value)
		}
	}

	// 排除已删除的记录
	qs = qs.Filter("is_deleted", 0)

	// 获取总数
	total, err := qs.Count()
	return total, err
}
